home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #11 / Amiga Plus CD - 2002 - No. 11.iso / Tools / Development / ncurses-5.3 / test / ditto.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-10-27  |  4.3 KB  |  149 lines

  1. /****************************************************************************
  2.  * Copyright (c) 1998,2001 Free Software Foundation, Inc.                   *
  3.  *                                                                          *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a  *
  5.  * copy of this software and associated documentation files (the            *
  6.  * "Software"), to deal in the Software without restriction, including      *
  7.  * without limitation the rights to use, copy, modify, merge, publish,      *
  8.  * distribute, distribute with modifications, sublicense, and/or sell       *
  9.  * copies of the Software, and to permit persons to whom the Software is    *
  10.  * furnished to do so, subject to the following conditions:                 *
  11.  *                                                                          *
  12.  * The above copyright notice and this permission notice shall be included  *
  13.  * in all copies or substantial portions of the Software.                   *
  14.  *                                                                          *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
  16.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
  17.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
  18.  * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
  19.  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
  20.  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
  21.  * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
  22.  *                                                                          *
  23.  * Except as contained in this notice, the name(s) of the above copyright   *
  24.  * holders shall not be used in advertising or otherwise to promote the     *
  25.  * sale, use or other dealings in this Software without prior written       *
  26.  * authorization.                                                           *
  27.  ****************************************************************************/
  28.  
  29. /*
  30.  * Author: Thomas E. Dickey <dickey@clark.net> 1998
  31.  *
  32.  * $Id: ditto.c,v 1.4 2001/09/15 21:53:37 tom Exp $
  33.  *
  34.  * The program illustrates how to set up multiple screens from a single
  35.  * program.  Invoke the program by specifying another terminal on the same
  36.  * machine by specifying its device, e.g.,
  37.  *    ditto /dev/ttyp1
  38.  */
  39. #include <test.priv.h>
  40. #include <sys/stat.h>
  41. #include <errno.h>
  42.  
  43. typedef struct {
  44.     FILE *input;
  45.     FILE *output;
  46.     SCREEN *screen;
  47. } DITTO;
  48.  
  49. static void
  50. failed(const char *s)
  51. {
  52.     perror(s);
  53.     ExitProgram(EXIT_FAILURE);
  54. }
  55.  
  56. static void
  57. usage(void)
  58. {
  59.     fprintf(stderr, "usage: ditto [terminal1 ...]\n");
  60.     ExitProgram(EXIT_FAILURE);
  61. }
  62.  
  63. static FILE *
  64. open_tty(char *path)
  65. {
  66.     FILE *fp;
  67.     struct stat sb;
  68.  
  69.     if (stat(path, &sb) < 0)
  70.     failed(path);
  71.     if ((sb.st_mode & S_IFMT) != S_IFCHR) {
  72.     errno = ENOTTY;
  73.     failed(path);
  74.     }
  75.     fp = fopen(path, "a+");
  76.     if (fp == 0)
  77.     failed(path);
  78.     printf("opened %s\n", path);
  79.     return fp;
  80. }
  81.  
  82. int
  83. main(
  84.     int argc GCC_UNUSED,
  85.     char *argv[]GCC_UNUSED)
  86. {
  87.     int j;
  88.     int active_tty = 0;
  89.     DITTO *data;
  90.  
  91.     if (argc <= 1)
  92.     usage();
  93.  
  94.     if ((data = (DITTO *) calloc(argc, sizeof(DITTO))) == 0)
  95.     failed("calloc data");
  96.  
  97.     data[0].input = stdin;
  98.     data[0].output = stdout;
  99.     for (j = 1; j < argc; j++) {
  100.     data[j].input =
  101.         data[j].output = open_tty(argv[j]);
  102.     }
  103.  
  104.     /*
  105.      * If we got this far, we have open connection(s) to the terminal(s).
  106.      * Set up the screens.
  107.      */
  108.     for (j = 0; j < argc; j++) {
  109.     active_tty++;
  110.     data[j].screen = newterm(
  111.                     (char *) 0,        /* assume $TERM is the same */
  112.                     data[j].output,
  113.                     data[j].input);
  114.     if (data[j].screen == 0)
  115.         failed("newterm");
  116.     cbreak();
  117.     noecho();
  118.     scrollok(stdscr, TRUE);
  119.     }
  120.  
  121.     /*
  122.      * Loop, reading characters from any of the inputs and writing to all
  123.      * of the screens.
  124.      */
  125.     for (;;) {
  126.     int ch;
  127.     set_term(data[0].screen);
  128.     ch = getch();
  129.     if (ch == ERR)
  130.         continue;
  131.     if (ch == 4)
  132.         break;
  133.     for (j = 0; j < argc; j++) {
  134.         set_term(data[j].screen);
  135.         addch(ch);
  136.         refresh();
  137.     }
  138.     }
  139.  
  140.     /*
  141.      * Cleanup and exit
  142.      */
  143.     for (j = argc - 1; j >= 0; j--) {
  144.     set_term(data[j].screen);
  145.     endwin();
  146.     }
  147.     ExitProgram(EXIT_SUCCESS);
  148. }
  149.